home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / comm / misc / easytransfer.lzh / EasyTransfer / AmigaSource / Remote.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-11  |  12.9 KB  |  538 lines

  1.  
  2. /* Remote.c By Kamran Karimi 
  3.    Part of EasyAmiga source.
  4. */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <fcntl.h>
  10. #include <stat.h>
  11.  
  12. #include <exec/types.h>
  13. #include <dos.h>
  14. #include <clib/dos_protos.h>
  15.  
  16. #include "ErrCodes.h"
  17.  
  18. #define min(a,b) (a) <= (b) ? (a) : (b)
  19.  
  20. #define QUIT 49
  21. #define DIR 50
  22. #define CD 51
  23. #define RECEIVE 52
  24. #define SEND 53
  25. #define MKDIR 54
  26. #define RMDIR 55
  27. #define DELETE 56
  28. #define CHECKLINK 57
  29.  
  30. #define MAXNAME 200
  31.  
  32. #define SERTESTLEN 255
  33.  
  34. #define BIOS 0
  35. #define HARD 1
  36.  
  37. extern long OverWriteProtect;
  38. extern long NumDone;
  39.  
  40. extern VOID ShowRemainder(ULONG Transfered, ULONG Total);
  41. extern VOID PrintFileName(char *Name);
  42. extern LONG ReceivePacket(VOID),SendPacket(VOID),ConfigSerial(ULONG BAUD);
  43. extern struct FInfo *First[2];
  44. extern USHORT FileNum[2];
  45.  
  46. extern VOID AddToList(struct FInfo *finfo,int list);
  47.  
  48. extern LONG GetSynch(VOID),PutSynch(VOID);
  49. extern LONG PutError(long ErrNo);
  50.  
  51.  
  52. extern SHORT Mode;
  53. extern SHORT CurrSpeed;
  54. extern SHORT Method;
  55.  
  56. extern size_t FileBuffSize;
  57.  
  58. struct FInfo  {
  59.  struct FInfo *next,*prev;
  60.  byte Selected,type;
  61.  char name[32];
  62.  char data[MAXAMINFOLEN + 10];
  63. };
  64.  
  65.  
  66. extern ULONG Speed[MAXHARDSPEED];
  67.  
  68. ULONG WorkstationWait[MAXHARDSPEED] = 
  69.   { 30, 60, 120, 240, 480, 960, 1920, 3840, 5760, 11520 }; 
  70.  
  71.  
  72. ULONG ErrorCode;    /* global error code */
  73.  
  74. union ReceiveUnion
  75. {
  76.  ULONG Len;
  77.  UBYTE Char[4];
  78. };
  79.  
  80. union ReceiveUnion Receive;
  81.  
  82. #define PACKET_SIZE 255
  83.  
  84. struct PacketStruct
  85. {
  86.  UBYTE Len;
  87.  UBYTE Data[PACKET_SIZE + 2];
  88. };
  89.  
  90. struct PacketStruct Packet;
  91.  
  92.  
  93. LONG ReceiveFile(VOID);
  94.  
  95.  
  96. LONG ReceiveDirectory(VOID)
  97. {
  98.  LONG Error;
  99.  UBYTE len,Name[MAXNAME];
  100.  
  101.  if((Error = PutSynch())) return Error;
  102.  Packet.Len = 1;
  103.  if((Error = ReceivePacket())) return Error; 
  104.  len = Packet.Data[0];
  105.  if((Error = PutSynch())) return Error;
  106.  Packet.Len = len;
  107.  if((Error = ReceivePacket())) return Error;
  108.  Packet.Data[len] = NULL;
  109.  strcpy(Name,Packet.Data);
  110.  if(mkdir(Name)) { PutError(ERROR_LocMKDir); return ERROR_LocMKDir; }
  111.  if(chdir(Name)) { PutError(ERROR_LocCHDir); return ERROR_LocCHDir; }
  112.  if((Error = PutSynch())) return Error;
  113.  NumDone++;
  114.  do
  115.  {
  116.   Packet.Len = 1;
  117.   if((Error = ReceivePacket())) { chdir("/"); return Error; }
  118.   if(Packet.Data[0] == 'E') break;
  119.   else if(Packet.Data[0] != '!') { chdir("/"); return ERROR_Direc; } 
  120.    if((Error = ReceiveFile())) { chdir("/"); return Error; }
  121.  }while(TRUE);
  122.  if((Error = PutSynch())) { chdir("/"); return Error; } 
  123.  if((Error = GetSynch())) { chdir("/"); return Error; } 
  124.  chdir("/"); 
  125.  return NO_ERROR;
  126. }
  127.     
  128.  /* create a file with the name "Name" and copies 
  129.     Receive.Len bytes to it */
  130. LONG ReceiveFile(VOID)
  131. {
  132.  LONG Error,index,count,TotalLen;
  133.  FILE  *file;
  134.  UBYTE len;
  135.  char Name[MAXNAME],TransBuff[PACKET_SIZE];
  136.  
  137.  PrintFileName(NULL);
  138.  ShowRemainder(0,0);
  139.  if((Error = PutSynch())) return Error;
  140.  Packet.Len = 1;
  141.  if((Error = ReceivePacket())) return Error;
  142.  if(Packet.Data[0] == 'D') 
  143.   return ReceiveDirectory();
  144.  else if(Packet.Data[0] != 'F') return ERROR_RecFile;
  145.  if((Error = PutSynch())) return Error;
  146.  Packet.Len = 4;
  147.  if((Error = ReceivePacket())) return Error;
  148.  for(count = 3; count >= 0; count--)
  149.   Receive.Char[count] = Packet.Data[count];
  150.  if((Error = PutSynch())) return Error;
  151.  Packet.Len = 1;
  152.  if((Error = ReceivePacket())) return Error;
  153.  len = Packet.Data[0]; 
  154.  if((Error = PutSynch())) return Error;
  155.  Packet.Len = len;
  156.  if((Error = ReceivePacket())) return Error;
  157.  Packet.Data[len] = NULL;
  158.  strcpy(Name,Packet.Data);
  159.  if(OverWriteProtect == TRUE)
  160.  {
  161.   if((file = fopen(Name,"r")))
  162.   { PutError(ERROR_GFExists); fclose(file); return ERROR_GFExists; }
  163.  }
  164.  if((file = fopen(Name,"wb"))== NULL) 
  165.  { PutError(ERROR_GetFile); return ERROR_GetFile; }
  166.  if((Error = PutSynch())) { fclose(file); return Error; }
  167.  if((Error = GetSynch())) { fclose(file); return Error; }
  168.  setvbuf(file,NULL,_IOFBF,FileBuffSize); 
  169.  PrintFileName(Name);
  170.  TotalLen = Receive.Len;
  171.  while(Receive.Len > 0)
  172.  {
  173.   len = min(Receive.Len,PACKET_SIZE);
  174.   Receive.Len -= len;
  175.   Packet.Len = 1;
  176.   Packet.Data[0] = len;
  177.   if((Error = SendPacket())) { fclose(file); return Error; }
  178.   Packet.Len = len;
  179.   if((Error = ReceivePacket())) { fclose(file); return Error; }
  180.   ShowRemainder(TotalLen - Receive.Len,TotalLen); 
  181.   index = 0;
  182.   for(count = 0; count < Packet.Len; count++)
  183.   { 
  184.    if((Mode == TEXT) && ((Packet.Data[count] == 13) || 
  185.                                   (Packet.Data[count] == 26)))
  186.     continue;
  187.    TransBuff[index++] = Packet.Data[count];
  188.   }
  189.   if(fwrite(TransBuff,1,index,file) != index)
  190.    { fclose(file); return ERROR_Write; } 
  191.  }
  192.  fclose(file);
  193.  NumDone++;
  194.  return NO_ERROR;
  195.  
  196.  
  197. LONG EstablishConnection(VOID)
  198. {
  199.  LONG Error;
  200.  
  201.  if((Error = PutSynch())) return Error;
  202.  if((Error = GetSynch())) return Error;
  203.  return NO_ERROR;
  204. }
  205.  
  206. LONG SendCMDLen(UBYTE CMDLen)
  207. {
  208.  LONG Error;
  209.  
  210.  if((Error = EstablishConnection())) return Error;
  211.  Packet.Len= 1;
  212.  Packet.Data[0] = CMDLen;
  213.  if((Error = SendPacket())) return Error;
  214.  if((Error = GetSynch())) return Error;
  215.  else return NO_ERROR;
  216.  
  217. LONG RemoteReceive(VOID)
  218. {
  219.  struct FInfo *tmp;
  220.  LONG FNameLen,count,Error;
  221.  
  222.  NumDone = 0; 
  223.  for(tmp = First[PC]; tmp; tmp = tmp->next)
  224.  {
  225.   if(tmp->Selected)
  226.   {
  227.    FNameLen = strlen(tmp->name);
  228.    if((Error = SendCMDLen(1 + FNameLen))) return Error;
  229.    Packet.Len = 1 + FNameLen;
  230.    Packet.Data[0] = RECEIVE;
  231.    for(count = 1; count <= FNameLen; count++)
  232.     Packet.Data[count] = tmp->name[count - 1];
  233.    if((Error = SendPacket())) return Error;
  234.    if((Error = GetSynch())) return Error;
  235.    if(Error = ReceiveFile()) return Error;
  236.   }
  237.  }
  238.  return NO_ERROR;
  239.  
  240.  
  241. LONG RemoteMKDir(char *Name)
  242. {
  243.  LONG Error,count,DNameLen = strlen(Name);
  244.  
  245.  NumDone = 0;
  246.  if((Error = SendCMDLen(1 + DNameLen))) return Error;
  247.  Packet.Len = 1 + DNameLen;
  248.  Packet.Data[0] =  MKDIR; 
  249.  for(count = 1; count <= DNameLen; count++)
  250.   Packet.Data[count] = Name[count - 1];
  251.  if((Error = SendPacket())) return Error;
  252.  Packet.Len = 1;
  253.  if((Error = ReceivePacket())) return Error;
  254.  if(Packet.Data[0] != '!') return ERROR_MKDIR;
  255.  NumDone = 1;
  256.  return NO_ERROR;
  257. }
  258.  
  259. LONG SendFile(char *Name);
  260.  
  261.  
  262. LONG HandleDirSend(char *Name)
  263. {
  264.  LONG Error,count;
  265.  __aligned
  266.  struct FileInfoBlock info;
  267.  
  268.  Packet.Len = 1;
  269.  Packet.Data[0] = 'D';
  270.  if((Error = SendPacket())) return Error;
  271.  if((Error = GetSynch())) return Error;
  272.  Packet.Len = 1;
  273.  Packet.Data[0] = strlen(Name);
  274.  if((Error = SendPacket())) return Error;
  275.  if((Error = GetSynch())) return Error;
  276.  for(count = 0; count < strlen(Name); count++)
  277.   Packet.Data[count] = Name[count];
  278.  Packet.Len = strlen(Name); 
  279.  if((Error = SendPacket())) return Error;
  280.  if((Error = GetSynch())) return Error;
  281.  if(chdir(Name)) return ERROR_LocCHDir;
  282.  NumDone++;
  283.  if(dfind(&info,"#?",1)) 
  284.  {
  285.   Packet.Len = 1;
  286.   Packet.Data[0] = 'E';
  287.   if((Error = SendPacket())) { chdir("/"); return Error; }
  288.   if((Error = GetSynch())) { chdir("/"); return Error; }
  289.   chdir("/");
  290.   return NO_ERROR;
  291.  }
  292.  do
  293.  {
  294.   if((Error = PutSynch())) { chdir("/"); return Error; }
  295.   if((Error = GetSynch())) { chdir("/"); return Error; }
  296.   if(info.fib_DirEntryType > 0) 
  297.   { 
  298.    if((Error = HandleDirSend(info.fib_FileName))) 
  299.    { chdir("/"); return Error; }
  300.   }
  301.   else
  302.   if((Error = SendFile(info.fib_FileName))) { chdir("/"); return Error; }
  303.  }while(!dnext(&info));
  304.  Packet.Len = 1;
  305.  Packet.Data[0] = 'E';
  306.  if((Error = SendPacket())) { chdir("/"); return Error; }
  307.  if((Error = GetSynch())) { chdir("/"); return Error; }
  308.  chdir("/");
  309.  return NO_ERROR;
  310.  
  311. LONG SendFile(char *Name)
  312. {
  313.  LONG Error,count,TotalLen,Transfered = 0;
  314.  FILE *file;
  315.  UBYTE len;
  316.  struct stat st;
  317.  char TempName[36];
  318.  
  319.  PrintFileName(NULL);
  320.  ShowRemainder(0,0);
  321.  strcpy(TempName,Name);
  322.  if(TempName[0] == '.') TempName[0] = '_'; 
  323.  if((file = fopen(Name,"rb")) == NULL) return ERROR_SendFile;
  324.  setvbuf(file,NULL,_IOFBF,FileBuffSize); 
  325.  if(fstat(fileno(file),&st)) { fclose(file); return ERROR_Stat; }
  326.  PrintFileName(Name);
  327.  Packet.Len = 1;
  328.  if(Mode == TEXT) Packet.Data[0] = 'T';
  329.  else Packet.Data[0] = 'B';
  330.  if((Error = SendPacket())) { fclose(file); return Error; }
  331.  if((Error = GetSynch())) { fclose(file); return Error; }
  332.  if(OverWriteProtect == TRUE) Packet.Data[0] = 'P';
  333.  else Packet.Data[0] = 'O';
  334.  if((Error = SendPacket())) { fclose(file); return Error; }
  335.  if((Error = GetSynch())) { fclose(file); return Error; }
  336.  Packet.Len = 1;
  337.  Packet.Data[0] = strlen(Name);
  338.  if((Error = SendPacket())) { fclose(file); return Error; }
  339.  if((Error = GetSynch())) { fclose(file); return Error; }
  340.  for(count = 0; count < strlen(Name); count++)
  341.   Packet.Data[count] = TempName[count];
  342.  Packet.Len = strlen(Name);
  343.  if((Error = SendPacket())) { fclose(file); return Error; }
  344.  if((Error = GetSynch())) { fclose(file); return Error; }
  345.  Receive.Len = st.st_size;
  346.  TotalLen = Receive.Len;
  347.  for(count = 3; count >= 0; count--)
  348.   Packet.Data[count] = Receive.Char[3 - count];
  349.  Packet.Len = 4;
  350.  if((Error = SendPacket())) { fclose(file); return Error; }
  351.  Transfered = 0;
  352.  while((TotalLen - Transfered) > 0)
  353.  {
  354.   Packet.Len = 1;
  355.   if((Error = ReceivePacket())) { fclose(file); return Error; }
  356.   len = Packet.Data[0];
  357.   if(fread(Packet.Data,1,len,file) != len)
  358.    { fclose(file); return ERROR_Read; }
  359.   Packet.Len = len;
  360.   if((Error = SendPacket())) { fclose(file); return Error; }
  361.   Transfered += len;
  362.   ShowRemainder(Transfered,TotalLen);
  363.  }
  364.  if((Error = GetSynch())) { fclose(file); return Error; } 
  365.  fclose(file);
  366.  NumDone++;
  367.  return NO_ERROR;
  368. }
  369.  
  370.  
  371. LONG RemoteSend(VOID)
  372. {
  373.  struct FInfo *tmp;
  374.  LONG Error;
  375.  
  376.  NumDone = 0;
  377.  for(tmp = First[AM]; tmp; tmp = tmp->next)
  378.  {
  379.   if(tmp->Selected)
  380.   {
  381.    if((Error = SendCMDLen(1))) return Error;
  382.    Packet.Len = 1;
  383.    Packet.Data[0] =  SEND;
  384.    if((Error = SendPacket())) return Error;
  385.    if((Error = GetSynch())) return Error;
  386.    if(tmp->type == DIRTYPE)  
  387.    { if((Error = HandleDirSend(tmp->name))) return Error; }
  388.    else if((Error = SendFile(tmp->name))) return Error;
  389.   }
  390.  }
  391.  return NO_ERROR;
  392. }
  393.  
  394. LONG RemoteDelFile(char *Name)
  395. {
  396.  LONG Error,count,FNameLen = strlen(Name);
  397.  
  398.  if((Error = SendCMDLen(1 + FNameLen))) return Error;
  399.  Packet.Len = 1 + FNameLen;
  400.  Packet.Data[0] =  DELETE;
  401.  for(count = 1; count <= FNameLen; count++)
  402.   Packet.Data[count] = Name[count - 1];
  403.  if((Error = SendPacket())) return Error;
  404.  if((Error = GetSynch())) return Error;
  405.  return NO_ERROR;
  406. }
  407.  
  408.  
  409. LONG RemoteDelDir(char *Name)
  410. {
  411.  LONG Error,count,DNameLen = strlen(Name);
  412.  
  413.  if((Error = SendCMDLen(1 + DNameLen))) return Error;
  414.  Packet.Len = 1 + DNameLen;
  415.  Packet.Data[0] =  RMDIR; 
  416.  for(count = 1; count <= DNameLen; count++)
  417.   Packet.Data[count] = Name[count - 1];
  418.  if((Error = SendPacket())) return Error;
  419.  if((Error = GetSynch())) return Error;
  420.  return NO_ERROR;
  421. }
  422.  
  423. LONG RemoteDel(VOID)
  424. {
  425.  struct FInfo *tmp;
  426.  
  427.  NumDone = 0;
  428.  for(tmp = First[PC]; tmp; tmp = tmp->next)
  429.  {
  430.   if(tmp->Selected)
  431.   {
  432.    if(tmp->type == FILETYPE) 
  433.    { if(RemoteDelFile(tmp->name)) return ERROR_FDelete; }
  434.    else 
  435.    { if(RemoteDelDir(tmp->name)) return ERROR_RMDIR; }
  436.    NumDone++; 
  437.   }
  438.  }
  439.  return NO_ERROR;
  440. }
  441.  
  442.  
  443. LONG RemoteCd(char *Path)
  444. {
  445.  LONG Error,result = NO_ERROR,count,PathLen = strlen(Path);
  446.  char temp;
  447.  
  448.  NumDone = 0;
  449.  if((Error = SendCMDLen(1 + PathLen))) return Error;
  450.  Packet.Len = 1 + PathLen;
  451.  Packet.Data[0] =  CD;
  452.  for(count = 1; count <= PathLen; count++)
  453.   Packet.Data[count] = Path[count - 1];
  454.  if((Error = SendPacket())) return Error;
  455.  Packet.Len = 1;
  456.  if((Error = ReceivePacket())) return Error;
  457.  if(Packet.Data[0] != '!') result = ERROR_CHDIR;
  458.  if((Error = PutSynch())) return Error;
  459.  Packet.Len = 1;
  460.  if((Error = ReceivePacket())) return Error;
  461.  count = Packet.Data[0];
  462.  if((Error = PutSynch())) return Error;
  463.  Packet.Len = count;
  464.  if((Error = ReceivePacket())) return Error;
  465.  temp = Packet.Data[0];
  466.  if((Error = PutSynch())) return Error;
  467.  if((Error = GetSynch())) return Error;
  468.  Packet.Data[0] = temp;
  469.  Packet.Data[count] = NULL; 
  470.  NumDone = 1;
  471.  return result;
  472. }
  473.  
  474. LONG RemoteQuit(VOID)
  475. {
  476.  LONG Error;
  477.  
  478.  NumDone = 0;
  479.  if((Error = SendCMDLen(1))) return Error;
  480.  Packet.Len = 1;
  481.  Packet.Data[0] =  QUIT;
  482.  if((Error = SendPacket())) return Error;
  483.  NumDone = 1;
  484.  return NO_ERROR;
  485. }
  486.  
  487. LONG RemoteDir(VOID)
  488. {
  489.  LONG Error,count;
  490.  struct FInfo *finfo;
  491.  UBYTE NextLineLen;
  492.  
  493.  NumDone = 0;
  494.  if((Error = SendCMDLen(1))) return Error;
  495.  Packet.Len = 1;
  496.  Packet.Data[0] =  DIR;
  497.  if((Error = SendPacket())) { return Error; }
  498.  while(TRUE)
  499.  {
  500.   Packet.Len = 1;
  501.   if((Error = ReceivePacket())) { return Error; }
  502.   NextLineLen = Packet.Data[0];
  503.   if((Error = PutSynch())) { return Error; }
  504.   if(NextLineLen == 0) break;
  505.   Packet.Len = NextLineLen;
  506.   if((Error = ReceivePacket())) return Error; 
  507.   finfo = malloc(sizeof(struct FInfo));
  508.   if(!finfo) return ERROR_NOMEM;
  509.   Packet.Data[NextLineLen] = NULL;
  510.   strcpy(finfo->data,Packet.Data);
  511.   if(finfo->data[0] == 'D')
  512.    finfo->type = DIRTYPE;
  513.   else 
  514.    finfo->type = FILETYPE;
  515.   finfo->data[0] = ' ';
  516.   for(count = 10; count < 22; count++)
  517.    finfo->name[count - 10] = Packet.Data[count];
  518.   for(count = 11; count >= 0; count--)
  519.   {
  520.    if(finfo->name[count] == ' ') finfo->name[count] = NULL;
  521.    else break;
  522.   } 
  523.   finfo->name[12] = NULL;
  524.   if(!First[PC]) FileNum[PC] = 1;
  525.   else FileNum[PC]++;
  526.   AddToList(finfo,PC);
  527.   if((Error = PutSynch())) return Error;
  528.  }
  529.  if((Error = GetSynch())) return Error; 
  530.  NumDone = 1;
  531.  return NO_ERROR;
  532. }
  533.  
  534.